package com.hx.util.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.StringUtils;

public class DateTool {

    /**
     * yyyy/MM/dd
     */
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static final long DAY_MILLION_SECONDS = 1000 * 60 * 60 * 24;
    public static String getToday(String fmt) {
        if (StringUtils.isBlank(fmt)) {
            fmt = YYYY_MM_DD;
        }
        Date dt = new java.util.Date();
        SimpleDateFormat sdf = new java.text.SimpleDateFormat(fmt);
        return sdf.format(dt);
    }
    
    public static String getDayTime(String fmt) {
        if (StringUtils.isBlank(fmt)) {
            fmt = YYYY_MM_DD_HH_MM_SS;
        }
        Date dt = new java.util.Date();
        SimpleDateFormat sdf = new java.text.SimpleDateFormat(fmt);
        return sdf.format(dt);
    }
    
    //获取当前日期
    public static String getDay() {
       return DateTool.getDate(new Date(),YYYY_MM_DD);
    }

    //获取当前日期
    public static String getDayTime() {
       return DateTool.getDate(new Date(),YYYY_MM_DD_HH_MM_SS);
    }
    /**
     * 字符串格式的日期与日期格式的日期按照相应的格式进行转换,此方法为根据指定日期格式返回相应的日期字符串
     * 
     * @param date
     *            指定日期
     * @param format
     *            指定日期格式字符串
     * @return 相应的日期字符串
     */
    public static String getDate(java.util.Date date, String format) {
        SimpleDateFormat df;
        try {
            df = new SimpleDateFormat(format);
            return df.format(date);
        } catch (Exception e) {
            return null;
        } finally {
            df = null;
        }
    }

    /**
     * 获取日期(format: yyyy-MM-dd)
     * @author 
     * @param p_date
     * @return
     */
    public static Date getDate(String p_date) {
        Date date = null;
        try {
            date = DateTool.getDate(p_date, DateTool.YYYY_MM_DD);
        } catch (ParseException e) {
        }
        return date;
    }

    /**
     * format: yyyy-MM-dd
     * @author 
     * @return
     */
    public static String getDefaultStringDate() {
        SimpleDateFormat df;
        try {
            df = new SimpleDateFormat(YYYY_MM_DD);
            return df.format(new Date());
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            df = null;
        }
    }

    /**
     * 字符串格式的日期与日期格式的日期按照相应的格式进行转换,此方法为根据指定日期字符串格式返回相应的日期
     * 
     * @param date
     *            指定日期字符串
     * @param format
     *            指定日期字符串格式
     * @return 相应的日期
     * @throws java.text.ParseException
     */
    public static java.util.Date getDate(String date, String format)
            throws java.text.ParseException {
        SimpleDateFormat df;
        try {
            df = new SimpleDateFormat(format);
            return df.parse(date);
        } catch (Exception e) {
            return null;
        } finally {
            df = null;
        }
    }

    /**
     * 数字格式的日期与日期格式的日期按照相应的格式进行转换,此方法为根据指定的数字日期返回对应的日期
     * 
     * @param date
     *            指定的数字日期
     * @return 对应的日期
     */
    public static java.util.Date getDate(long date) {
        try {
            return new java.util.Date(date);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
        }
    }

    /**
     * 数字格式的日期与日期格式的日期按照相应的格式进行转换,此方法为根据指定的数字日期和指定的日期格式返回对应的日期字符串
     * 
     * @param date
     *            指定的数字日期
     * @param format
     *            指定的日期格式
     * @return 对应的日期字符串
     */
    public static String getDate(long date, String format) {
        SimpleDateFormat df;
        java.util.Date de;
        try {
            df = new SimpleDateFormat(format);
            de = new java.util.Date(date);

            return df.format(de);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            df = null;
            de = null;
        }
    }

    /**
     * 数字格式的日期与日期格式的日期按照相应的格式进行转换,此方法为根据指定的日期返回对应的数字日期
     * 
     * @param date
     *            指定的日期
     * @return 对应的数字日期
     */
    public static long getDate(java.util.Date date) {
        try {
            return date.getTime();
        } catch (Exception e) {
            return 0;
        }

    }

    /**
     * 日期加减，提供当前日期以及指定的年月日时分秒进行日期加减；
     * 
     * @param now
     *            当前数字格式日期
     * @param year
     *            年
     * @param month
     *            月
     * @param day
     *            日
     * @param hour
     *            时
     * @param minute
     *            分
     * @param second
     *            秒
     * @return 经过日期加减处理过的数字日期
     */
    public static long getDate(long now, int year, int month, int day,
            int hour, int minute, int second) {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(now);
        if (second != 0) {
            cal.add(Calendar.SECOND, second);
        }
        if (minute != 0) {
            cal.add(Calendar.MINUTE, minute);
        }
        if (hour != 0) {
            cal.add(Calendar.HOUR, hour);
        }
        if (day != 0) {
            cal.add(Calendar.DATE, day);
        }
        if (month != 0) {
            cal.add(Calendar.MONTH, month);
        }
        if (year != 0) {
            cal.add(Calendar.YEAR, year);
        }

        return cal.getTime().getTime();
    }

    /**
     * 根据传入的日期，欲转换成的日期样式，返回转换后的日期字符串
     * 
     * @param ldate
     *            - 日期
     * @param pattern
     *            - 具体的值范围见java.text.SimpleDateFormat的说明
     * @see java.text.SimpleDateFormat
     * @return String 转换后的日期字符串
     */
    public static String format(Date ldate, String pattern) {
        DateFormat dateFormat = new SimpleDateFormat(pattern);
        return dateFormat.format(ldate);
    }

    /**
     * 根据传入的字符串，欲转换成的日期样式，返回转换后的日期
     * 
     * @param ldate
     *            - 日期
     * @param pattern
     *            - 具体的值范围见java.text.SimpleDateFormat的说明
     * @see java.text.SimpleDateFormat
     * @return Date 转换后的日期
     * @throws ParseException
     */
    public static Date parse(String ldate, String pattern)
            throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat(pattern);
        return dateFormat.parse(ldate);
    }

    public static void main(String args[]) {
        System.out.println(getDay());
        System.out.println(getDayTime());
    }

    /**
     * 增加几个月
     * @author 
     * @param month
     * @return
    
     */
    public static String addMonth(int month) {
        java.text.DateFormat df = new java.text.SimpleDateFormat(YYYY_MM_DD);
        Calendar l_calendar = Calendar.getInstance();
        l_calendar.add(Calendar.MONTH, month);
        return df.format(l_calendar.getTime());
    }

    /**
     * 增加几个月
     * @author 
     * @param month
     * @return
     */
    public static Date addMonthDate(int month) {
        Calendar l_calendar = Calendar.getInstance();
        l_calendar.add(Calendar.MONTH, month);
        return l_calendar.getTime();
    }

    /**
     * 加天数
     */
    public static Date addDays(Date date,int days) {
        Calendar l_calendar = Calendar.getInstance();
        l_calendar.setTime(date);                
        l_calendar.add(Calendar.DATE, days);
        return l_calendar.getTime();
    }

    /**
     * 加小时
     */
    public static Date addHours(Date date,int hours) {
        Calendar l_calendar = Calendar.getInstance();
        l_calendar.setTime(date);                
        l_calendar.add(Calendar.HOUR, hours);
        return l_calendar.getTime();
    }
}